package cn.b.sky.user.service.impl;

import cn.b.sky.common.exception.ImeException;
import cn.b.sky.user.dao.SytemParameterDao;
import cn.b.sky.user.service.ParameterService;
import cn.b.sky.user.service.model.ParameterEntity;
import cn.b.sky.user.service.model.ParameterFolder;
import cn.b.sky.user.service.model.ParameterValue;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service("parameterService")
public class ParameterServiceImpl implements ParameterService {
  @Autowired
  private SytemParameterDao sytemParameterDao;

  @Override
  public List<ParameterFolder> getAllParameterFolder(String siteCode) {

    return sytemParameterDao.selectAllParameters(siteCode);
  }

  @Override
  public void saveParameterFolder(ParameterFolder folder) {
    if (folder != null && !StringUtils.isBlank(folder.getFolderCode())) {
      sytemParameterDao.saveParameterFolder(folder);
    }

  }

  @Override
  public void saveSyParameter(ParameterEntity parameter) {
    if (parameter != null && !StringUtils.isBlank(parameter.getParameterCode())) {
      sytemParameterDao.saveParameterEntity(parameter);
      if (parameter.getParameterValue() != null && parameter.getParameterValue().size() > 0) {
        sytemParameterDao.deleteParameterValueByPcode(parameter.getParameterCode(), parameter.getSiteCode());
        for (ParameterValue pv : parameter.getParameterValue()) {
          pv.setParameterCode(parameter.getParameterCode());
          pv.setSiteCode(parameter.getSiteCode());
          //调整日期赋值对象
          pv.setCreateDateTime(new Date());
          pv.setCreateUser(parameter.getCreateUser());
          //调整日期赋值对象
          pv.setModifyDateTime(new Date());
          pv.setModifyUser(parameter.getModifyUser());
          sytemParameterDao.saveParameterValue(pv);
        }
      }
    }

  }

  @Override
  public void modifySyParameter(ParameterEntity parameter) {
    if (parameter != null && !StringUtils.isBlank(parameter.getParameterCode())) {
      sytemParameterDao.updateParameterEntity(parameter);
      if (parameter.getParameterValue() != null && parameter.getParameterValue().size() > 0) {
        sytemParameterDao.deleteParameterValueByPcode(parameter.getParameterCode(), parameter.getSiteCode());
        for (ParameterValue pv : parameter.getParameterValue()) {
          if (!StringUtils.isBlank(pv.getValue())) {
            pv.setParameterCode(parameter.getParameterCode());
            //设置工厂代码
            pv.setSiteCode(parameter.getSiteCode());
            //调整日期赋值对象
            pv.setCreateDateTime(new Date());
            pv.setCreateUser(parameter.getCreateUser());
            //调整日期赋值对象
            pv.setModifyDateTime(new Date());
            pv.setModifyUser(parameter.getModifyUser());
            sytemParameterDao.saveParameterValue(pv);
          }
        }
      }
    }

  }

  @Override
  public void modifyParameterFolder(ParameterFolder folder) {
    if (folder != null && !StringUtils.isBlank(folder.getFolderCode())) {
      sytemParameterDao.updateParameterFolder(folder);
    }

  }

  @Override
  public ParameterEntity getParameterEntityByCode(String parameterCode, String siteCode) {
    if (StringUtils.isBlank(parameterCode)) {
      return null;
    } else {
      ParameterEntity p = sytemParameterDao.selectParameterByPCode(parameterCode, siteCode);
      if (p == null || StringUtils.isBlank(p.getParameterCode())) {
        throw ImeException.newException("systemParameterIsnotDefine.M", new String[] { parameterCode });
      }
      return p;
    }
  }

  @Override
  public ParameterFolder getParameterFolderByCode(String folderCode, String siteCode) {
    if (StringUtils.isBlank(folderCode)) {
      return null;
    }
    return sytemParameterDao.selectParameterFolderByCode(folderCode, siteCode);
  }

  @Override
  public void deleteConfigCategory(String folderCode, String siteCode) {
    if (!StringUtils.isBlank(folderCode)) {
      sytemParameterDao.deleteParameterFolder(folderCode, siteCode);
    }

  }

  @Override
  public void deleteConfig(String parameterCode, String siteCode) {
    if (!StringUtils.isBlank(parameterCode)) {
      sytemParameterDao.deleteParameterValueByPcode(parameterCode, siteCode);
      sytemParameterDao.deleteParameterEntity(parameterCode, siteCode);
    }

  }

  @Override
  public List<ParameterValue> getParameterValuesByPCode(String parameterCode, String siteCode) {
    if (!StringUtils.isBlank(parameterCode)) {
      return sytemParameterDao.selectParameterValueByPcode(parameterCode, siteCode);
    }
    return null;
  }

  @Override
  public List<ParameterValue> getParameterValueBySql(String sql) {
    if (!StringUtils.isBlank(sql)) {
      if (checkedSql(sql)) {
        return sytemParameterDao.queryParameterValueBySql(sql);
      } else {
        throw ImeException.newException("ParameterSql_error.M");
      }
    }
    return null;
  }

  private boolean checkedSql(String sql) {
    if (StringUtils.isBlank(sql)) {
      return false;
    }
    String[] checks = sql.split("as");
    if (checks.length < 2) {
      return false;
    }
    Boolean value = false;
    Boolean valueText = false;
    for (String s : checks) {
      s = s.trim();
      if (s.startsWith("value") && !s.startsWith("valueText")) {
        value = true;
        continue;
      } else if (s.startsWith("valueText")) {
        valueText = true;
        continue;
      }
    }
    return value && valueText;
  }

}
